namespace Mbl.ParameterizedTest.FluentCollectionBuilding
{
    public class Justifier<TIn1, TOut, TCollector>
        where TCollector : ITestCollector<TIn1, TOut>
    {
        private readonly TCollector _testRowCollector;
        private readonly TestCase<TIn1, TOut> _testCase;
		
        public Justifier(TCollector testRowCollector, TestCase<TIn1, TOut> testCase)
        {
            _testRowCollector = testRowCollector;
            _testCase = testCase;
        }

        public TCollector Because(string justification)
        {
            _testCase.Justification = justification;
            _testRowCollector.AddTestCase(_testCase);
            return _testRowCollector;
        }

        public TCollector Fact()
        {
            _testCase.Justification = "";
            _testRowCollector.AddTestCase(_testCase);
            return _testRowCollector;
        }
    }
    public class Justifier<TIn1, TIn2, TOut, TCollector>
        where TCollector : ITestCollector<TIn1, TIn2, TOut>
    {
        private readonly TCollector _testRowCollector;
        private readonly TestCase<TIn1, TIn2, TOut> _testCase;
		
        public Justifier(TCollector testRowCollector, TestCase<TIn1, TIn2, TOut> testCase)
        {
            _testRowCollector = testRowCollector;
            _testCase = testCase;
        }

        public TCollector Because(string justification)
        {
            _testCase.Justification = justification;
            _testRowCollector.AddTestCase(_testCase);
            return _testRowCollector;
        }

        public TCollector Fact()
        {
            _testCase.Justification = "";
            _testRowCollector.AddTestCase(_testCase);
            return _testRowCollector;
        }
    }
    public class Justifier<TIn1, TIn2, TIn3, TOut, TCollector>
        where TCollector : ITestCollector<TIn1, TIn2, TIn3, TOut>
    {
        private readonly TCollector _testRowCollector;
        private readonly TestCase<TIn1, TIn2, TIn3, TOut> _testCase;
		
        public Justifier(TCollector testRowCollector, TestCase<TIn1, TIn2, TIn3, TOut> testCase)
        {
            _testRowCollector = testRowCollector;
            _testCase = testCase;
        }

        public TCollector Because(string justification)
        {
            _testCase.Justification = justification;
            _testRowCollector.AddTestCase(_testCase);
            return _testRowCollector;
        }

        public TCollector Fact()
        {
            _testCase.Justification = "";
            _testRowCollector.AddTestCase(_testCase);
            return _testRowCollector;
        }
    }
    public class Justifier<TIn1, TIn2, TIn3, TIn4, TOut, TCollector>
        where TCollector : ITestCollector<TIn1, TIn2, TIn3, TIn4, TOut>
    {
        private readonly TCollector _testRowCollector;
        private readonly TestCase<TIn1, TIn2, TIn3, TIn4, TOut> _testCase;
		
        public Justifier(TCollector testRowCollector, TestCase<TIn1, TIn2, TIn3, TIn4, TOut> testCase)
        {
            _testRowCollector = testRowCollector;
            _testCase = testCase;
        }

        public TCollector Because(string justification)
        {
            _testCase.Justification = justification;
            _testRowCollector.AddTestCase(_testCase);
            return _testRowCollector;
        }

        public TCollector Fact()
        {
            _testCase.Justification = "";
            _testRowCollector.AddTestCase(_testCase);
            return _testRowCollector;
        }
    }
    public class Justifier<TIn1, TIn2, TIn3, TIn4, TIn5, TOut, TCollector>
        where TCollector : ITestCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TOut>
    {
        private readonly TCollector _testRowCollector;
        private readonly TestCase<TIn1, TIn2, TIn3, TIn4, TIn5, TOut> _testCase;
		
        public Justifier(TCollector testRowCollector, TestCase<TIn1, TIn2, TIn3, TIn4, TIn5, TOut> testCase)
        {
            _testRowCollector = testRowCollector;
            _testCase = testCase;
        }

        public TCollector Because(string justification)
        {
            _testCase.Justification = justification;
            _testRowCollector.AddTestCase(_testCase);
            return _testRowCollector;
        }

        public TCollector Fact()
        {
            _testCase.Justification = "";
            _testRowCollector.AddTestCase(_testCase);
            return _testRowCollector;
        }
    }
    public class Justifier<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut, TCollector>
        where TCollector : ITestCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut>
    {
        private readonly TCollector _testRowCollector;
        private readonly TestCase<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut> _testCase;
		
        public Justifier(TCollector testRowCollector, TestCase<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut> testCase)
        {
            _testRowCollector = testRowCollector;
            _testCase = testCase;
        }

        public TCollector Because(string justification)
        {
            _testCase.Justification = justification;
            _testRowCollector.AddTestCase(_testCase);
            return _testRowCollector;
        }

        public TCollector Fact()
        {
            _testCase.Justification = "";
            _testRowCollector.AddTestCase(_testCase);
            return _testRowCollector;
        }
    }
}